package 图书管理项目;

//使用这个类，封装——数据库建立连接的操作



import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

//1.创建 DataSource实例
//2.根据 DataSource 创建对应的 Connection
public class DBUtil {
    private static final String URL="jdbc:mysql://127.0.0.1:3306/bookManager?characterEncoding=utf8&useSSL=false";
    private static final String USERNAME="root";
    private static final String PassWord="suojie123";

    //单例模式中的懒汉模式
    //初始情况下，dataSource为null，没有被实例化
    //首次调用  getDataSource() 时，才会被实例化
    //如果程序中没用到 getDataSource()，就永远不需要实例化
    private static DataSource dataSource=null;
    private static DataSource getDataSource() {
        if (dataSource==null) {
            dataSource=new MysqlDataSource();

            ((MysqlDataSource)dataSource).setUrl(URL);
            ((MysqlDataSource)dataSource).setUser(USERNAME);
            ((MysqlDataSource)dataSource).setPassword(PassWord);
        }
        return dataSource;
    }

    public static Connection getConnection() throws SQLException {
        return getDataSource().getConnection();

    }



    //单例模式中的饿汉模式
    //无论怎样都会实例化 dataSource
    //private static DataSource dataSource1=new MysqlDataSource();
    //此处的dataSource实例是在类加载阶段进行实例化的，类加载阶段是很早的阶段，程序一启动大概率就会触发DBUtil的类加载，
    //这种风格的单例模式就是：饿汉模式

    //单例模式中还有另一种风格：懒汉模式
    //懒汉模式是直到第一次使用这个类的时候才会实例化，实例化时机比饿汉模式更迟(延时加载)
    //实际中 懒汉模式比饿汉模式更有优势

    //单例模式——static
    //加上static后 dataSource就变成 类属性， dataSource和DBUtil的实例无关，只是DBUti类相关
    //类属性：在类被创建的时候才会被创建。实例属性：每个实例被创建的时候都会被创建。
    //类相关：创建类的时候才会有相关属性，什么时候创建类？类加载阶段创建类，一个类只被加载一次，那么类属性也就创建一次。

    //单例模式——静态代码块，用来设置属性的值,在类加载阶段调用静态代码块
    //    static {
    //        ((MysqlDataSource)dataSource1).setUrl(URL);
    //        ((MysqlDataSource)dataSource1).setUser(USERNAME);
    //        ((MysqlDataSource)dataSource1).setPassword(PassWord);
    //    }

    //提供一个方法，建立连接
    //public 使外面能访问到，static使得无需创建 DBUtil实例，就可以调用这个方法，访问数据库的连接
    //    public static Connection getConnection1() throws SQLException {
    //        return dataSource1.getConnection();
    //
    //    }

    //提供一个方法，释放资源
    public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet) {
        //后申请先释放
        if (resultSet!=null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (statement!=null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (connection!=null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        //这种
        try {
            if (resultSet!=null) {
                resultSet.close();
            }

            if (statement!=null) {
                statement.close();
            }

            if (connection!=null) {
                connection.close();
            }
        }catch (SQLException e) {
            e.printStackTrace();
        }
    }


}
